package pe.com.ValoracionVivienda.views.mantenimiento.ArquitecturasRed;

import java.util.Date;

import javax.persistence.EntityTransaction;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import pe.com.ValoracionVivienda.container.AppContainer;
import pe.com.ValoracionVivienda.domain.entities.ArquitecturaRNA;
import pe.com.ValoracionVivienda.domain.entities.Usuario;
import pe.com.ValoracionVivienda.service.impl.ArquitecturaRNAServiceJpaImpl;
import pe.com.ValoracionVivienda.service.interfaces.ArquitecturaRNAService;

public class ShellArquitecturaRedDetalle extends Shell {
	private Text txtNombre;
	private Text txtCapaOculta;
	private Text txtTasaAprendizaje;
	private Text txtTiempoAprendizaje;
	private boolean huboCambios;
	private ArquitecturaRNA arquitecturaRNA;
	private Button chkActivo;

	/**
	 * Create the shell.
	 * @param display
	 */
	public ShellArquitecturaRedDetalle(Display display) {
		super(display, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
		
		Label lblNewLabel = new Label(this, SWT.NONE);
		lblNewLabel.setBounds(27, 27, 68, 15);
		lblNewLabel.setText("Nombre");
		
		txtNombre = new Text(this, SWT.BORDER);
		txtNombre.setBounds(176, 24, 311, 21);
		
		Label lblCapaOculta = new Label(this, SWT.NONE);
		lblCapaOculta.setBounds(27, 54, 63, 15);
		lblCapaOculta.setText("Capa oculta");
		
		txtCapaOculta = new Text(this, SWT.BORDER);
		txtCapaOculta.setBounds(176, 51, 311, 21);
		
		txtTasaAprendizaje = new Text(this, SWT.BORDER);
		txtTasaAprendizaje.setBounds(176, 78, 311, 21);
		
		txtTiempoAprendizaje = new Text(this, SWT.BORDER);
		txtTiempoAprendizaje.setBounds(176, 105, 311, 21);
		
		Label lblTasaDeAprendizaje = new Label(this, SWT.NONE);
		lblTasaDeAprendizaje.setText("Tasa aprendizaje");
		lblTasaDeAprendizaje.setBounds(27, 81, 87, 15);
		
		Label lblTiempoEntrenamiento = new Label(this, SWT.NONE);
		lblTiempoEntrenamiento.setText("Ciclos de entrenamiento");
		lblTiempoEntrenamiento.setBounds(27, 108, 143, 15);
		
		chkActivo = new Button(this, SWT.CHECK);
		chkActivo.setSelection(true);
		chkActivo.setBounds(176, 132, 93, 16);
		
		Label lblActivo = new Label(this, SWT.NONE);
		lblActivo.setText("Activo");
		lblActivo.setBounds(27, 133, 122, 15);
		
		Button btnAceptar = new Button(this, SWT.NONE);
		btnAceptar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				aceptar();
			}
		});
		btnAceptar.setBounds(312, 159, 75, 25);
		btnAceptar.setText("Aceptar");
		
		Button btnCancelar = new Button(this, SWT.NONE);
		btnCancelar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				cancelar();
			}
		});
		btnCancelar.setBounds(412, 159, 75, 25);
		btnCancelar.setText("Cancelar");
		createContents();
		centrarEnPantalla(display);
	}
	
	public void initData(ArquitecturaRNA arquitecturaRNA){
		this.arquitecturaRNA = arquitecturaRNA;
		
		if (arquitecturaRNA.getId() != null){
			txtNombre.setText(arquitecturaRNA.getNombre());
			txtTasaAprendizaje.setText(Float.toString(arquitecturaRNA.getLearningRate()));
			txtCapaOculta.setText(arquitecturaRNA.getCapaOculta());
			//txtMomentum.setText(Float.toString(arquitecturaRNA.getMomentum()));
			txtTiempoAprendizaje.setText(Integer.toString(arquitecturaRNA.getTrainingTime()));
			chkActivo.setSelection(arquitecturaRNA.getEstado());
		}
	}

	protected void cancelar() {
		this.dispose();
	}

	protected void aceptar() {
		EntityTransaction tran = null;		
		ArquitecturaRNAService arquitecturaRNAService = new ArquitecturaRNAServiceJpaImpl();
		arquitecturaRNA.setNombre(txtNombre.getText());
		arquitecturaRNA.setCapaOculta(txtCapaOculta.getText());
		arquitecturaRNA.setLearningRate(Float.parseFloat(txtTasaAprendizaje.getText()));
		//arquitecturaRNA.setMomentum(Float.parseFloat(txtMomentum.getText()));
		arquitecturaRNA.setMomentum((float)0.2);
		arquitecturaRNA.setTrainingTime(Integer.parseInt(txtTiempoAprendizaje.getText()));
		arquitecturaRNA.setEstado(chkActivo.getSelection());
		
		try {
			tran = arquitecturaRNAService.getTransaction();
        	tran.begin();
        	if (arquitecturaRNA.getId() == null){
        		arquitecturaRNA.setUsuarioCreacion(new Usuario(AppContainer.ID_USUARIO));
        		arquitecturaRNA.setFechaCreacion(new Date());
        		arquitecturaRNAService.persist(arquitecturaRNA);
        	} else {
        		arquitecturaRNA.setUsuarioModificacion(new Usuario(AppContainer.ID_USUARIO));
        		arquitecturaRNA.setFechaModificacion(new Date());
        		arquitecturaRNAService.update(arquitecturaRNA);
        	}
        	tran.commit();
        	huboCambios = true;
        	this.close();
		} catch (Exception e) {
			tran.rollback();
		} finally {
			arquitecturaRNAService.close();
        }
	}

	/**
	 * Create contents of the shell.
	 */
	protected void createContents() {
		setText("Arquitectura Red");
		setSize(512, 227);

	}
	
	private void centrarEnPantalla(Display display){
		Monitor primary = display.getPrimaryMonitor();
	    Rectangle bounds = primary.getBounds();
	    Rectangle rect = getBounds();
	    
	    int x = bounds.x + (bounds.width - rect.width) / 2;
	    int y = bounds.y + (bounds.height - rect.height) / 2;
	    setLocation(x, y);
	}
	
	public boolean getHuboCambios(){ return huboCambios;}

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}
}
